/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ordenar;

import java.io.RandomAccessFile;
import javax.swing.JOptionPane;
import persistencia.Register;
import persistencia.RegisterFile;

/**
 *
 * @author ivan
 */
public class QuikSort implements MethodOrder{


    /**
       * Ordena el RegisterFile de menor a mayor, de acuerdo a las comparaciones realizadas por compareTo(), usando el
       * algoritmo QuickSort. El archivo sale cerrado.
     */

    public boolean ordenar(RegisterFile reg) {
        boolean retorno = true;

        try
            {
                  long n = reg.registerCount();
                  this.quick(0, n-1,reg);
            }
            catch(Exception e)
            {
                retorno =false;
            }
        return retorno;
    }
    private void quick (long izq, long der,RegisterFile accesos)
      {
          try
          {
               long i, j, c;
               Register ri = new Register( accesos.tipoDatosAlmacenados() );
               Register rj = new Register( accesos.tipoDatosAlmacenados() );
               Register rc = new Register( accesos.tipoDatosAlmacenados() );

               i = izq;  j = der;
               c = (izq + der) / 2;
               accesos.seekRegister( c );
               accesos.read( rc );

               do
               {

                    accesos.seekRegister( i );
                    accesos.read( ri );
                    while ( ri.compareTo( rc ) < 0  &&  i < der )
                    {
                           i++;
                           accesos.seekRegister( i );
                           accesos.read( ri );
                    }

                    accesos.seekRegister( j );
                    accesos.read( rj );
                    while (rc.compareTo( rj ) < 0  &&  j > izq )
                    {
                          j--;
                          accesos.seekRegister( j );
                          accesos.read( rj );
                    }

                    if ( i <= j )
                    {
                          // Hay que intercambiar. Los grabo al rev�s!!!
                          accesos.seekRegister( j );
                          accesos.write( ri );

                          accesos.seekRegister( i );
                          accesos.write( rj );

                          i++;
                          j--;
                    }
               }
               while (i <= j);

               if ( izq < j ) quick( izq, j,accesos );
               if ( i < der ) quick( i, der,accesos );
          }
          catch(Exception e)
          {
                JOptionPane.showMessageDialog(null, "Error al ordenar con QuickSort: " + e.getMessage());
                System.exit(1);
          }
     }

    public String toString()
    {
        return "QuikSort";
    }

}
